/* Copyright 2024 NVIDIA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#pragma once

#include "cupynumeric/cupynumeric_task.h"

namespace cupynumeric {

// Match these to BitGeneratorOperation in config.py
enum class BitGeneratorOperation : int32_t {
  CREATE       = CUPYNUMERIC_BITGENOP_CREATE,
  DESTROY      = CUPYNUMERIC_BITGENOP_DESTROY,
  RAND_RAW     = CUPYNUMERIC_BITGENOP_RAND_RAW,
  DISTRIBUTION = CUPYNUMERIC_BITGENOP_DISTRIBUTION,
};

// Match these to BitGeneratorType in config.py
enum class BitGeneratorType : uint32_t {
  DEFAULT       = CUPYNUMERIC_BITGENTYPE_DEFAULT,
  XORWOW        = CUPYNUMERIC_BITGENTYPE_XORWOW,
  MRG32K3A      = CUPYNUMERIC_BITGENTYPE_MRG32K3A,
  MTGP32        = CUPYNUMERIC_BITGENTYPE_MTGP32,
  MT19937       = CUPYNUMERIC_BITGENTYPE_MT19937,
  PHILOX4_32_10 = CUPYNUMERIC_BITGENTYPE_PHILOX4_32_10,
};

// Match these to BitGeneratorDistribution in config.py
enum class BitGeneratorDistribution : int32_t {
  INTEGERS_16       = CUPYNUMERIC_BITGENDIST_INTEGERS_16,
  INTEGERS_32       = CUPYNUMERIC_BITGENDIST_INTEGERS_32,
  INTEGERS_64       = CUPYNUMERIC_BITGENDIST_INTEGERS_64,
  UNIFORM_32        = CUPYNUMERIC_BITGENDIST_UNIFORM_32,
  UNIFORM_64        = CUPYNUMERIC_BITGENDIST_UNIFORM_64,
  LOGNORMAL_32      = CUPYNUMERIC_BITGENDIST_LOGNORMAL_32,
  LOGNORMAL_64      = CUPYNUMERIC_BITGENDIST_LOGNORMAL_64,
  NORMAL_32         = CUPYNUMERIC_BITGENDIST_NORMAL_32,
  NORMAL_64         = CUPYNUMERIC_BITGENDIST_NORMAL_64,
  POISSON           = CUPYNUMERIC_BITGENDIST_POISSON,
  EXPONENTIAL_32    = CUPYNUMERIC_BITGENDIST_EXPONENTIAL_32,
  EXPONENTIAL_64    = CUPYNUMERIC_BITGENDIST_EXPONENTIAL_64,
  GUMBEL_32         = CUPYNUMERIC_BITGENDIST_GUMBEL_32,
  GUMBEL_64         = CUPYNUMERIC_BITGENDIST_GUMBEL_64,
  LAPLACE_32        = CUPYNUMERIC_BITGENDIST_LAPLACE_32,
  LAPLACE_64        = CUPYNUMERIC_BITGENDIST_LAPLACE_64,
  LOGISTIC_32       = CUPYNUMERIC_BITGENDIST_LOGISTIC_32,
  LOGISTIC_64       = CUPYNUMERIC_BITGENDIST_LOGISTIC_64,
  PARETO_32         = CUPYNUMERIC_BITGENDIST_PARETO_32,
  PARETO_64         = CUPYNUMERIC_BITGENDIST_PARETO_64,
  POWER_32          = CUPYNUMERIC_BITGENDIST_POWER_32,
  POWER_64          = CUPYNUMERIC_BITGENDIST_POWER_64,
  RAYLEIGH_32       = CUPYNUMERIC_BITGENDIST_RAYLEIGH_32,
  RAYLEIGH_64       = CUPYNUMERIC_BITGENDIST_RAYLEIGH_64,
  CAUCHY_32         = CUPYNUMERIC_BITGENDIST_CAUCHY_32,
  CAUCHY_64         = CUPYNUMERIC_BITGENDIST_CAUCHY_64,
  TRIANGULAR_32     = CUPYNUMERIC_BITGENDIST_TRIANGULAR_32,
  TRIANGULAR_64     = CUPYNUMERIC_BITGENDIST_TRIANGULAR_64,
  WEIBULL_32        = CUPYNUMERIC_BITGENDIST_WEIBULL_32,
  WEIBULL_64        = CUPYNUMERIC_BITGENDIST_WEIBULL_64,
  BYTES             = CUPYNUMERIC_BITGENDIST_BYTES,
  BETA_32           = CUPYNUMERIC_BITGENDIST_BETA_32,
  BETA_64           = CUPYNUMERIC_BITGENDIST_BETA_64,
  F_32              = CUPYNUMERIC_BITGENDIST_F_32,
  F_64              = CUPYNUMERIC_BITGENDIST_F_64,
  LOGSERIES         = CUPYNUMERIC_BITGENDIST_LOGSERIES,
  NONCENTRAL_F_32   = CUPYNUMERIC_BITGENDIST_NONCENTRAL_F_32,
  NONCENTRAL_F_64   = CUPYNUMERIC_BITGENDIST_NONCENTRAL_F_64,
  CHISQUARE_32      = CUPYNUMERIC_BITGENDIST_CHISQUARE_32,
  CHISQUARE_64      = CUPYNUMERIC_BITGENDIST_CHISQUARE_64,
  GAMMA_32          = CUPYNUMERIC_BITGENDIST_GAMMA_32,
  GAMMA_64          = CUPYNUMERIC_BITGENDIST_GAMMA_64,
  STANDARD_T_32     = CUPYNUMERIC_BITGENDIST_STANDARD_T_32,
  STANDARD_T_64     = CUPYNUMERIC_BITGENDIST_STANDARD_T_64,
  HYPERGEOMETRIC    = CUPYNUMERIC_BITGENDIST_HYPERGEOMETRIC,
  VONMISES_32       = CUPYNUMERIC_BITGENDIST_VONMISES_32,
  VONMISES_64       = CUPYNUMERIC_BITGENDIST_VONMISES_64,
  ZIPF              = CUPYNUMERIC_BITGENDIST_ZIPF,
  GEOMETRIC         = CUPYNUMERIC_BITGENDIST_GEOMETRIC,
  WALD_32           = CUPYNUMERIC_BITGENDIST_WALD_32,
  WALD_64           = CUPYNUMERIC_BITGENDIST_WALD_64,
  BINOMIAL          = CUPYNUMERIC_BITGENDIST_BINOMIAL,
  NEGATIVE_BINOMIAL = CUPYNUMERIC_BITGENDIST_NEGATIVE_BINOMIAL,
};

}  // namespace cupynumeric
